package scream.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import scream.excepcion.DAOExcepcion;
import scream.modelo.TipoProductoServicio;
import scream.util.ConexionBD;

public class TipoProductoServicioDAO {
		public Collection<TipoProductoServicio> buscarPorCodigo(String codigo) throws DAOExcepcion {
			System.out.println("coTipoProductoServicioDAO: buscarPorCodigo(String codigo)");
			String query = "SELECT coTipoProductoServicio, noTipoProductoServicio FROM TipoProductoServicio WHERE coTipoProductoServicio like ?";
			
			Collection<TipoProductoServicio> lista = new ArrayList<TipoProductoServicio>();
			Connection con = null;
			PreparedStatement stmt = null;
			ResultSet rs = null;
			try {
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setString(1, "%" + codigo + "%");
				rs = stmt.executeQuery();
				while (rs.next()) {
					TipoProductoServicio vo = new TipoProductoServicio();
					vo.setCoTipoProductoServicio(rs.getString("coTipoProductoServicio"));
					vo.setNoTipoProductoServicio(rs.getString("noTipoProductoServicio"));
					lista.add(vo);
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
			} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
			return lista;
		}

		
		private void cerrarConexion(Connection con) {
			// TODO Auto-generated method stub
			
		}


		private void cerrarStatement(PreparedStatement stmt) {
			// TODO Auto-generated method stub
			
		}


		private void cerrarResultSet(ResultSet rs) {
			// TODO Auto-generated method stub
			
		}
		private String validarParametros(String codigo,String nombre){
			System.out.println("Valida parametros");
			if(codigo.length()>2){
				
				return "Error BD: El codigo supero el limite permitido";
			}
			else if (nombre.length()>25){
				return "Error BD: El nombre supero el limite permitido";
				
			}
			else
				return "";
			
		}
		public TipoProductoServicio BuscarPorNombre(String NoServicioProducto) throws DAOExcepcion {
			System.out.println("TipoProductoServicioDAO: BuscarPorNombre(String noTipoProductoServicio)");
			TipoProductoServicio vo = null;
			Connection con = null;
			PreparedStatement stmt = null;
			ResultSet rs = null;
			String MsgValidacion=validarParametros("",NoServicioProducto);
			if(MsgValidacion.length()>0)
				throw new DAOExcepcion(MsgValidacion);
			
			try {
				String query = "select coTipoProductoServicio, noTipoProductoServicio from TipoProductoServicio where noTipoProductoServicio=?";
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setString(1, NoServicioProducto);
				System.out.println(stmt.toString());
				rs = stmt.executeQuery();
			
				if (rs.next()) {
					vo=new TipoProductoServicio();
					vo.setCoTipoProductoServicio(rs.getString(1));
					vo.setNoTipoProductoServicio(rs.getString(2));
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
			} finally {
				this.cerrarResultSet(rs);
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
			return vo;
		}
		public void insertar(TipoProductoServicio vo) throws DAOExcepcion {
			System.out.println("TipoProductoServicioDAO: insertar(TipoProductoServicio vo)");
			String query = "INSERT INTO TipoProductoServicio(coTipoProductoServicio, noTipoProductoServicio) VALUES (?,?)";
			Connection con = null;
			PreparedStatement stmt = null;
			System.out.println(vo.getCoTipoProductoServicio() + " - " + vo.getNoTipoProductoServicio());
			String MsgValidacion=validarParametros(vo.getCoTipoProductoServicio(),vo.getNoTipoProductoServicio());
			if(MsgValidacion.length()>0)
				throw new DAOExcepcion(MsgValidacion);
			
			if(BuscarPorNombre(vo.getNoTipoProductoServicio())!=null)
			{
				
				throw new DAOExcepcion("El tipo de producto " + vo.getNoTipoProductoServicio() + " ya existe.");
			}
			
			try {
				con = ConexionBD.obtenerConexion();
				stmt = con.prepareStatement(query);
				stmt.setString(1, vo.getCoTipoProductoServicio());
				stmt.setString(2, vo.getNoTipoProductoServicio());
				int i = stmt.executeUpdate();
				if (i != 1) {
					throw new SQLException("No se pudo insertar");
				}
			} catch (SQLException e) {
				System.err.println(e.getMessage());
				throw new DAOExcepcion(e.getMessage());
			} finally {
				this.cerrarStatement(stmt);
				this.cerrarConexion(con);
			}
		}

			public TipoProductoServicio obtener(String coTipoProductoServicio) throws DAOExcepcion {
				System.out.println("coTipoProductoServicioDAO: obtener(String coTipoProductoServicio)");
				TipoProductoServicio vo = new TipoProductoServicio();
				Connection con = null;
				PreparedStatement stmt = null;
				ResultSet rs = null;
				try {
					String query = "select coTipoProductoServicio, noTipoProductoServicio from TipoProductoServicio where coTipoProductoServicio=?";
					con = ConexionBD.obtenerConexion();
					stmt = con.prepareStatement(query);
					stmt.setString(1, coTipoProductoServicio);
					rs = stmt.executeQuery();
					if (rs.next()) {
						vo.setCoTipoProductoServicio(rs.getString(1));
						vo.setNoTipoProductoServicio(rs.getString(2));
					}
				} catch (SQLException e) {
					System.err.println(e.getMessage());
					throw new DAOExcepcion(e.getMessage());
				} finally {
					this.cerrarResultSet(rs);
					this.cerrarStatement(stmt);
					this.cerrarConexion(con);
				}
				return vo;
			}

			public void eliminar(String TipoProductoServicioNombre) throws DAOExcepcion {
				System.out.println("coTipoProductoServicioDAO: eliminar(String coTipoProductoServicio)");
				String query = "DELETE FROM TipoProductoServicio WHERE coTipoProductoServicio=?";
				Connection con = null;
				PreparedStatement stmt = null;
				try {
					con = ConexionBD.obtenerConexion();
					stmt = con.prepareStatement(query);
					stmt.setString(1, TipoProductoServicioNombre);
					int i = stmt.executeUpdate();
					if (i != 1) {
						throw new SQLException("No se pudo eliminar");
					}
				} catch (SQLException e) {
					System.err.println(e.getMessage());
					throw new DAOExcepcion(e.getMessage());
				} finally {
					this.cerrarStatement(stmt);
					this.cerrarConexion(con);
				}
			}

			public void actualizar(TipoProductoServicio vo) throws DAOExcepcion {
				System.out.println("TipoProductoServicioDAO: actualizar(TipoProductoServicio vo)");
				String query = "update TipoProductoServicio set noTipoProductoServicio=? where noTipoProductoServicio=?";
				Connection con = null;
				PreparedStatement stmt = null;
				try {
					con = ConexionBD.obtenerConexion();
					stmt = con.prepareStatement(query);
					stmt.setString(1, vo.getNoTipoProductoServicio());
					stmt.setString(2, vo.getCoTipoProductoServicio());
					int i = stmt.executeUpdate();
					if (i != 1) {
						throw new SQLException("No se pudo actualizar");
					}
				} catch (SQLException e) {
					System.err.println(e.getMessage());
					throw new DAOExcepcion(e.getMessage());
				} finally {
					this.cerrarStatement(stmt);
					this.cerrarConexion(con);
				}
			}

			
			public Collection<TipoProductoServicio> listar() throws DAOExcepcion {
					System.out.println("TipoProductoServicioDAO: listar()");
					Collection<TipoProductoServicio> c = new ArrayList<TipoProductoServicio>();
					Connection con = null;
					PreparedStatement stmt = null;
					ResultSet rs = null;
					try {
						con = ConexionBD.obtenerConexion();
						String query = "SELECT coTipoProductoServicio,noTipoProductoServicio from TipoProductoServicio";
						stmt = con.prepareStatement(query);
						rs = stmt.executeQuery();
						while (rs.next()) {
							TipoProductoServicio vo = new TipoProductoServicio();
							vo.setCoTipoProductoServicio(rs.getString("coTipoProductoServicio"));
							vo.setNoTipoProductoServicio(rs.getString("noTipoProductoServicio"));
							c.add(vo);
						}
					} catch (SQLException e) {
						System.err.println(e.getMessage());
						throw new DAOExcepcion(e.getMessage());
					} finally {
						this.cerrarStatement(stmt);
						this.cerrarConexion(con);
					}
					return c;
				}

			public TipoProductoServicio findcoTipoProductoServicio(String CoTipoProductoServicio) throws DAOExcepcion {
				System.out.println("TipoProductoServicioDAO: findTipoProductoServicio(String CoTipoProductoServicio)");
				TipoProductoServicio oTipoProductoServicio = null;
				Connection con = null;
				PreparedStatement stmt = null;
				ResultSet rs = null;
				try {
					String query = "SELECT * FROM TipoProductoServicio WHERE CoTipoProductoServicio = ?";
					con = ConexionBD.obtenerConexion();
					stmt = con.prepareStatement(query);
					stmt.setString(1, CoTipoProductoServicio);
					rs = stmt.executeQuery();
					if (rs.next()) {
						oTipoProductoServicio = new TipoProductoServicio();
						oTipoProductoServicio.setCoTipoProductoServicio(rs.getString("CoTipoProductoServicio"));
					}
				} catch (SQLException e) {
					throw new DAOExcepcion(e.getMessage());
				} finally {
					this.cerrarResultSet(rs);
					this.cerrarStatement(stmt);
					this.cerrarConexion(con);
				}
				return oTipoProductoServicio;
			}	
			public Collection<TipoProductoServicio> listar(String noServicioProducto) throws DAOExcepcion {
				System.out.println("TipoProductoServicioDAO: listar()");
				Collection<TipoProductoServicio> c = new ArrayList<TipoProductoServicio>();
				Connection con = null;
				PreparedStatement stmt = null;
				ResultSet rs = null;
				try {
					con = ConexionBD.obtenerConexion();
					String query = "SELECT coTipoProductoServicio,noTipoProductoServicio from TipoProductoServicio " + 
									"where noTipoProductoServicio like ?";
					stmt = con.prepareStatement(query);
					stmt.setString(1, "%" + noServicioProducto + "%");
					rs = stmt.executeQuery();
					while (rs.next()) {
						TipoProductoServicio vo = new TipoProductoServicio();
						vo.setCoTipoProductoServicio(rs.getString("coTipoProductoServicio"));
						vo.setNoTipoProductoServicio(rs.getString("noTipoProductoServicio"));
						c.add(vo);
					}
				} catch (SQLException e) {
					System.err.println(e.getMessage());
					throw new DAOExcepcion(e.getMessage());
				} finally {
					this.cerrarStatement(stmt);
					this.cerrarConexion(con);
				}
				return c;
			}
}